package cn.knightzz.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.knightzz.entity.SysRoleMenu;
import cn.knightzz.mapper.SysRoleMenuMapper;
import cn.knightzz.service.SysRoleMenuService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author knightzz
 * @since 2021-04-18
 */
@Service
public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> implements SysRoleMenuService {

    @Resource
    SysRoleMenuMapper roleMenuMapper;

    @Override
    public List<SysRoleMenu> getMenuIdListByRoleId(Integer roleId) {
        List<SysRoleMenu> sysRoleMenus = roleMenuMapper.getMenuListByRoleId(roleId);
        return sysRoleMenus;
    }

    public void assignRoleMenu(ArrayList<Long> menuIds, Long roleId) {
        QueryWrapper<SysRoleMenu> queryWrapper = new QueryWrapper<>();
        // 先删除原来的
        queryWrapper.eq("role_id", roleId);
        roleMenuMapper.delete(queryWrapper);

        // 添加新的
        SysRoleMenu sysRoleMenu = new SysRoleMenu();
        sysRoleMenu.setRoleId(roleId);
        for (Long menuId : menuIds) {
            sysRoleMenu.setMenuId(menuId);
            roleMenuMapper.insert(sysRoleMenu);
        }
    }
    public void assignRoleMenu2(ArrayList<Long> menuIds, Long roleId) {

        log.debug("rids : " + menuIds + " roleId " + roleId);

        if (ObjectUtil.isNotEmpty(menuIds)) {
            // 根据菜单id列表和角色id更新角色菜单表
            // (原数据)101 102 103 10101 10201 || (更新的数据)101 102 103 10301
            // 原数据和新数据 取差集 : 10101 10201 (删除)
            // 新数据和原数剧 取差集 : 10301 (更新)
            List<SysRoleMenu> roleMenus = getMenuIdListByRoleId(roleId.intValue());
            if(roleMenus.isEmpty()){
                // 角色菜单表中根本没有数据的情况下, 所有数据都需要插入进去
                for (Long menuId : menuIds) {
                    // 封装数据
                    SysRoleMenu roleMenu = new SysRoleMenu();
                    roleMenu.setRoleId(roleId);
                    roleMenu.setMenuId(menuId);
                    // 插入数据
                    roleMenuMapper.insert(roleMenu);
                }
            }else {
                // 这个里面存储的是 被删除的数据的 id, 而不是 菜单id
                List<Long> deleteDatas = new ArrayList<>();
                for (SysRoleMenu roleMenu : roleMenus) {
                    // 原数据
                    Long menuId = roleMenu.getMenuId();
                    if (menuIds.contains(menuId)) {
                        //  如果原数据和更新的数据都有的情况下,  说明不需要删除或者插入, 那么这条数据就要被从更新数据中移除
                        menuIds.remove(menuId);
                    } else {
                        // 说明 更新数据中没有这条数据,但是原数据中有,那么这条数据是需要被删除的
                        // 那么将这条数据添加到被删除数据的列表中
                        deleteDatas.add(roleMenu.getId());
                    }
                }
                // deleteDatas 是需要被删除的 数据的 id
                // menuIds 是需要插入的菜单的 id
                // 处理数据
                if(!deleteDatas.isEmpty()){
                    // 需要判断删除的是否非空
                    roleMenuMapper.deleteBatchIds(deleteDatas);
                }
                for (Long menuId : menuIds) {
                    // 封装数据
                    SysRoleMenu roleMenu = new SysRoleMenu();
                    roleMenu.setRoleId(roleId);
                    roleMenu.setMenuId(menuId);
                    // 插入数据
                    roleMenuMapper.insert(roleMenu);
                }
            }
        }
    }

    // 取消角色授权
    @Override
    public void deleteRoleMenu(Integer roleId, Integer menuId) {
        QueryWrapper<SysRoleMenu> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("role_id", roleId);
        queryWrapper.eq("menu_id", menuId);
        log.debug("=>");
        roleMenuMapper.delete(queryWrapper);
    }
}
